java如何解决异常是应该抛出还是应该处理的问题

情况如上图,问g()应该抛出f()的异常还是处理掉f()的异常?


一、如果h()无需知道g()是否成功或者是否出错,或者h()对g()出错与否不能控制和解决,那么g()就无需向h()报告异常

二、如果h()在运行中需要知道g()是否成功以及可以对g()出错进行处理,那么g()不能自己处理掉异常,应该往上抛出。

三、g()可以将f()的异常如下处理:

     private void g(){

try {

f();

catch (Exception e) {

throw new RuntimeException("RuntimeException in g() !", e);

}

}

这样,h()既可以选择处理g()中抛出的异常,如:

    private void h(){

try{

g();

catch(RuntimeException re){

try{

throw (Exception)re.getCause();//找出原始的异常

catch(Exception e){

System. out.println("g() Exception in h() has been dealt");//处理原始的异常

}

}

}

也可以直接放弃处理该异常,此时java编译器不会强制要求处理g()中的异常!


综上所述,g()是否继续抛出异常,这本身不取决于自己,而是取决于上层调用函数

package inputfile;

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

public class InputFile {

private BufferedReader in ;//代表资源

//构造函数,应该自行负责资源打开失败时的资源释放问题,它只应该向上层表示

//资源是否打开成功,至于成功与否的其他扫尾问题不应该由高层处理

public InputFile(String fname) throws Exception {

try {

in= new BufferedReader(new FileReader(fname));//打开资源

catch (FileNotFoundException e) {

System. out.println("Could not open " +fname);

throw e;

catch(Exception e){

try {

in.close();

catch (IOException e1) {

System. out.println("in.close() unsuccessful" );

}

throw e;

}

}

//资源处理函数,如果处理出错或者发生特殊情况是有理由让上层知道在资源处理过程

//中究竟发生了什么,这样上层才能进一步采取措施

public String getLine() throws IOException{

String s;

s= in.readLine();

return s;

}

//资源释放函数,不应该往上抛出异常,因为本类已经是处理资源的基础类,如果

//连本类都不知道怎么释放资源,那么即使往上抛出异常,上层也不知道如何处理

public void dispose(){

try {

in.close();

catch (IOException e) {

throw new RuntimeException("in.close() failed !");

}

}

}

package inputfile;

public class Test {

public static void main(String[] args) {

try {

InputFile input=new InputFile( "dfjkd");

try{

String s=input .getLine();

catch(Exception e){

e.printStackTrace();

finally{

input.dispose();

}

catch (Exception e) {

e.printStackTrace();

}

}

}

时间: 2024-11-08 21:38:08

java如何解决异常是应该抛出还是应该处理的问题的相关文章

Atitti 跨语言异常的转换抛出 java js

异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出RuntimeException vs 还是e.cause; 应该抛出完整e,因为runtimeE可能还有一些说明.. 那如何捕获异常,可以判断,如果是RuntimeException,那么捕获他的cause就可.. function convert2jsEx(data) { if(typeof data=="string") { try{ d

java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法

package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: 有一个类为ClassA,有一个类为ClassB,在ClassB中有一个方法b,此方法抛出异常,在ClassA类中有一个 * 方法a,请在这个方法中调用b,然后抛出异常.在客户端有一个类为TestC,有一个方法为c ,请在这个方法中捕 捉异常的信息.Java异常的处理机制 * * 如果try或cat

解决okHttp使用https抛出stream was reset: PROTOCOL_ERROR的问题

昨天在做Android接口调用的时候,api接口是https的,用okhttp抛出: okhttp3.internal.http2.StreamResetException: stream was reset: PROTOCOL_ERROR 原因是协议错误导致的,解决办法很简单,在实例化okhttpclient的时候用以下方法: OkHttpClient client = new OkHttpClient.Builder() .protocols(Collections.singletonLis

JS异常捕获和抛出

try...catch 用来异常捕获(主要适用于IE5以上内核的浏览器,也是最常用的异常捕获方式) 使用onerror时间捕获异常,这种捕获方式是比较古老的一中方式,目前一些主流的浏览器暂不支持这种 捕获方式. 捕获异常的语法如下: try { //运行代码 } catch(err) { //处理错误 } 测试示例代码如下,abc是一个未定义的函数,会抛出异常,异常信息会被try catch,进入catch语句中执行 var msg = ""; try{ abc(); }catch(e

JAVA Socket连接服务器时可能抛出的异常

1.UnknownHostException:host(非ip)无法识,就会报该异常,www.google.com.hk这个虽然也ping不通,但是不会报该错,因为他是一个确实存在的域名.他会报ConnectionException 2.ConnectException:一般是ip或者host或者域名是通的,但是端口不通,就会报该错.另外如果域名存在,但是网络如果做了限制,也会报该错的.如果服务端做了连接数的限制,如果客户端同时连接的过多的时候也会报该错. 设置服务端连接数的构造方法如下:pub

异常的数字抛出,为什么会出现错误?(未解决)

#include <iostream> using namespace std; class A { public: A(int a, int b) { this->a = a; this->b = b; cout << "我是快乐的构造函数.\n"; } ~A() { cout << "我是无能的析构函数\n"; } protected: private: int a; int b; }; void divide()

捕获Java线程池执行任务抛出的异常

Java中线程执行的任务接口java.lang.Runnable 要求不抛出Checked异常, public interface Runnable { public abstract void run();} 那么如果 run() 方法中抛出了RuntimeException,将会怎么处理了? 通常java.lang.Thread对象运行设置一个默认的异常处理方法: java.lang.Thread.setDefaultUncaughtExceptionHandler(UncaughtExce

Java中抛出的各种异常

目录(?)[-] 引子 JAVA异常 处理异常机制 捕获异常trycatch 和 finally try-catch语句 trycatch-finally语句 try-catch-finally 规则异常处理语句的语法规则 trycatchfinally语句块的执行顺序 抛出异常 throws抛出异常 使用throw抛出异常 Throwable类中的常用方法 Java常见异常 runtimeException子类 IOException 其他 自定义异常 1. 引子 try…catch…fina

JAVA 语言如何进行异常处理,关键字: throws,throw,try,catch,finally分别代表什么意义? 在try块中可以抛 出异常吗?

Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类, 并提供了良好的接口.        在 Java中,每个异常都是一个对象,它是 Throwable 类或其它子类的实例.当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理. Java的异常处理是通过 5个关键词来实现的: try. catch. throw.throws和finally.       一般情况下是用 try来执行一段程序,如果出现异常,系统会抛出( th