返回信息流初学java,一个函数内部有多个异常,其中有一个异常是当前try-catch就可以解决,但是其他的异常必须向上一层抛出,所以能不能只在函数体内部catch这一个异常,而其他的异常在函数头上通过throws抛给上一层?求解答!求各路大神指导![ema1]
这是一条镜像帖。来源:北邮人论坛 / java / #43590同步于 2015/8/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java异常处理的时候throws
happygirl
2015/8/18镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
public void tryCatchAndThrow throw AException {
try{
doSomething(); // throws AException and BException
}catch(BException){
dealWithBException();
}
}
thx very much!但是如果这两种异常都是IO异常呢?是同一种异常怎么办~~
【 在 dss886 的大作中提到: 】
: [code=java]
: public void tryCatchAndThrow throw AException {
: try{
: ...................
唔。。。这样?
public void tryCatchAndThrow throws IOException {
try{
doSomething();
}catch(IOException e){
if(e.getMessage().equals("xxx")){
dealWith();
}else{
throw e;
}
}
}
【 在 happygirl 的大作中提到: 】
: thx very much!但是如果这两种异常都是IO异常呢?是同一种异常怎么办~~
哦哦,酱紫啊,get it,我去瞅瞅!!再次感谢
【 在 dss886 的大作中提到: 】
: 唔。。。这样?
: [code=java]
: public void tryCatchAndThrow throws IOException {
: ...................
说实话,这种必须抓或者标注的异常(checked exception)是Java语言设计上的一大败笔。还好JVM对抛什么异常没有限制,用别的JVM语言(比如groovy或者scala)的话异常随便抛,不抓就自己抛。
没懂。。。求解释。。。
【 在 nuanyangyang 的大作中提到: 】
: 说实话,这种必须抓或者标注的异常(checked exception)是Java语言设计上的一大败笔。还好JVM对抛什么异常没有限制,用别的JVM语言(比如groovy或者scala)的话异常随便抛,不抓就自己抛。
个人认为java的check ex是一大妙手。要知道大量的api使用者并不是很牛逼的程序员,受检异常在api的安全性和可用性上功不可没
【 在 nuanyangyang 的大作中提到: 】
: 说实话,这种必须抓或者标注的异常(checked exception)是Java语言设计上的一大败笔。还好JVM对抛什么异常没有限制,用别的JVM语言(比如groovy或者scala)的话异常随便抛,不抓就自己抛。
【 在 roseking 的大作中提到: 】
: 个人认为java的check ex是一大妙手。要知道大量的api使用者并不是很牛逼的程序员,受检异常在api的安全性和可用性上功不可没
关键是,大多数异常是致命的,这就是为什么它被称为“异常”。通常说来,抛出异常的情况没有什么好的办法可以处理。比如想打开文件但文件不存在。如果强制去“处理”它,通常的结果是那些“不是很牛逼的程序猿”根本没有真正“处理”这个异常。
InputStream is;
try {
is = new FileInputStream("....");
....
} catch (FileNotFoundException e) {
e.printStackTrace();
}
is.read(buf); // 空指针异常
还会引起“接口”定义的问题:能不能抛异常成了接口的一部分。
interface Runnable {
void run(); // 没有任何异常。也就是run不会抛出异常
}
class FileWriteJob1 implements Runnable {
@Override
public void run() throws IOException { // 编译错误:Runnable.run不可以抛出异常。
FileOutputStream fis = new FileOutputStream("someFile");
fis.write(...);
fis.close();
}
class FileWriteJob2 implements Runnable {
@Override
public void run() { // 编译正确。
try {
FileOutputStream fis = new FileOutputStream("someFile");
fis.write(...);
fis.close();
} catch (IOException e) {
e.printStackTrace(); // 没有更好的处理方法,因为不能抛了。
}
}
public static void main(String[] args) {
Runnable job1 = FileWriteJob2();
Runnable job2 = FileWriteJob2();
Runnable job3 = FileWriteJob2();
job1.run();
// 这里怎么知道job1有没有失败?
job2.run();
// 如果我想job2失败的时候停止处理job3怎么办?
job3.run();
// 到最后,万一有job失败了,只是打印出异常,没办法处理
}
}
class FileWriteJob3 implements Runnable {
// 定义一个自己的异常。是RuntimeException。
public static class MyFileWriteException extends RuntimeException {
...
}
@Override
public void run() { // 编译正确。
try {
FileOutputStream fis = new FileOutputStream("someFile");
fis.write(...);
fis.close();
} catch (IOException e) { // 这里只是简单地封装一下再抛出,本质上还是没有处理。
throw new MyFileWriteException(e); // RuntimeException随便抛,无视声明。
}
}
public static void main(String[] args) {
Runnable job1 = FileWriteJob2();
Runnable job2 = FileWriteJob2();
Runnable job3 = FileWriteJob2();
try {
job1.run(); // 这三个run都有可能抛出RuntimeException。
job2.run();
job3.run();
} catch (MyFileWriteException e) {
// 在这里处理
}
}
}
更多请看: http://bbs.byr.cn/#!article/Java/27107?p=1
【 在 roseking 的大作中提到: 】
: 个人认为java的check ex是一大妙手。要知道大量的api使用者并不是很牛逼的程序员,受检异常在api的安全性和可用性上功不可没
还有C#的设计者Anders Hejlsberg谈checked exception
http://www.artima.com/intv/handcuffs.html