A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李光耀 中级黑马   /  2012-12-1 17:00  /  2944 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李光耀 于 2013-2-24 17:58 编辑

                          毕老师视频讲 功能内部能解决的就用catch
                                                解决不了用throws告诉调用者,由调用者解决

麻烦举个例子, 什么情况下是功能内部能解决的? 什么情况下是功能内部解决不了的?  
                           (个人还在看基础,希望大牛们能讲的通俗简单一点。。)

5 个回复

倒序浏览
import java.io.*;
public class Test4
{
public static void main(String[] args)
{
//double sum=0;
//double array[]={1,2,3};
//for(double value:array){
// sum+=value;
//}
//System.out.println(sum);
File file=new File("D:\\testFile\\","example.txt");
if(!file.exists()){
try { // try语句块捕捉可能出现的异常
file.createNewFile(); // 创建该文件
System.out.println("文件已创建"); // 输出的提示信息
} catch (Exception e) { // catch处理该异常
e.printStackTrace(); // 输出异常信息
}


}
System.out.println("文件名称:"+file.getName());
System.out.println("文件的相对路径:"+file.getPath());
System.out.println("文件的绝对路径:"+file.getAbsolutePath());
System.out.println("文件可以读取:"+file.canRead());
System.out.println("文件可以写入:"+file.canWrite());
System.out.println("文件大小:"+file.length()+"B");
}
}
java中,为什么在输入输出中,要用捕捉异常结构语句???

为什么? 这个是一个java设计原则,但资料一时找不到相关资料了,你可以找一下java的异常设计。 当一个可能发生不可回逆的错误时就应该抛出异常,IO的输入输出符合这一个原则,包括网络的输入输出等,存在可能被中断的情况下而发生不可回逆的数据错误,因此IO类会抛出异常,你必须进行对这个可能的异常进行处理,也就是须加try catch块。  资料如下:
在可能会出现exception的地方,要使用try-catch或者throws或者两者都要。我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-catch掉这个exception;如果希望外部知道,则在catch到之后把exception直接抛出或者抛出自定义的exception。   
一、异常的种类   
java异常可以分成两大类:Exception和RuntimeException(虽然RuntimeException是从Exception继承的)。exception异常代表“无法避免的异常” 如io异常   往往这类异常是由于外部原因造成的,程序本身无法保证他们不发生,所以这类异常必须捕获。如果在函数内部无法处理这个异常必须再次抛出(在函数后面用throws语句),如果什么都不做就出现编译错误。
runtimexception是指“可以避免的异常”,如 null引用异常,这类异常都是由程序内部原因造成的,是可以避免的。对于这类异常可以忽略他们,但一旦发生程序就会异常终止。这类异常对debug非常有帮助,当然,如果需要也可以catch。

另外,有些地方即使不会有exception,但是从商业逻辑上是错误的、非预期的,也可以抛出user exception。例如,用户输入非法,bank account非法透支等等。

二、主要原则   
处理意外的一个重要原则,就是要么处理,要么接着抛,决不能吃掉(You either handle it, or throw it. You don’t eat it.)这就是说,当你捕获一个异常之后,必须决定是否立即处理这个异常,或者继续抛出这个异常(或者另一个自定义异常),以便由调用的客户端捕获之。当客户端捕获到以后,又会继续进行类似的判断。

一般来说,GUI端是要处理异常的,比如JSP捕获到异常之后,需要先是给用户一个友好的出错信息,而不要给出系统的出错信息。系统的出错信息一方面不太友好,另一方面提供了太多的系统信息,容易被恶意用户用来攻击系统。

换句话说,所有的异常最终必须有一个终极的处理者,这就是GUI。至于中间的环节,比如在服务器端运行的JavaBean是否要处理捕获到的异常,还是继续抛出所捕获的异常,需要视具体情况处理。   

除非你想把异常处理的责任交给调用者,一般不用throws。比如你要读入一些文件,如果你想通知调用者,让调用者决定如何处理这个异常,你就把这个异常throws给调用者;如果你知道应该如何处理这个异常,或者你想把异常马上解决,你可以就地catch她。

这完全取决于你想把异常自己立即处理还是想把处理责任返回给调用者。取决于你的程序的结构和要求。   
需要注意的有:
1、如果无法处理某个异常,那就不要捕获它。   
2、如果捕获了一个异常,请不要胡乱处理它。   
3、尽量在靠近异常被抛出的地方捕获异常。   
4、在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出。   
5、按照您的异常处理必须多精细来构造您的方法。   
6、需要用几种类型的异常就用几种,尤其是对于应用程序异常。   

三、异常嵌套和捕获适当的异常

按照Java语言的定义,所谓异常(Exception)指的就是向调用方法(calling method)表示发生非正常情况的习惯方式。下面讨论两种在处理异常时可兹利用的技术:异常嵌套和捕获适当的异常。

异常嵌套   
你在试图捕获异常并打算扔出异常时该采取什么措施呢?同时,你希望原始的异常信息可用吗?   

要回答以上的问题你不妨尝试一下NestedException类。具体的编程并不难,唯一要做的无非是利用构造器并且重载printStackTrace()以便显示出正确的数据。

此外,你还应当考虑封装Throwable而非Exception类来创建更具有重用性的组件。之后,你可以创建NestedRuntimeException变量封装Throwable但无需对其进行声明。

捕获适当的异常
正确地处理异常并不是一项轻松的任务,这是因为异常的处理有时会导致程序出现其他不明行为。不过,以下三条规则可以帮助你避免错误处理异常所可能遭遇的风险。

规则 #1: 总是捕获扔出异常的类型而不要理睬异常的超类。为了遵守通常的代码习惯,你可以采用Exception类的大写字母作为变量名,如下所示:   
    catch(FileNotFoundException fnfe)   
以及
    catch(SQLException sqle)

规则 # 2: 决不让catch块留空。在很多情况下虽然确实编写了try/catch块但在代码的catch部分却什么都没有做。或者,如果采用了日志API(Logging API),那么请编写代码把异常写到日志中。

规则 # 3: 决不扔出Exception基类的实例。开发人员应当总是扔出自己创建的异常类。

扔出异常的API很难处理。在声明方法扔出java.lang.Exception的情况下,所有的问题都会强加在API用户的头上,这样他们就无法以一种专业的编程方式来处理异常。通过为扔出API声明Exception类的子类这一举措,API开发人员就可以减轻用户的负担。

以上提到的两种技术在处理异常时还可能用得更好、更适当。嵌套技术令异常扔到另一异常的内部,而捕获适当的异常令程序调试大大简化。
回复 使用道具 举报
Tokgo 发表于 2012-12-1 17:51
import java.io.*;
public class Test4
{

:shutup:我理解能力比较差,能不能再简单的表示一下什么事功能内部能解决的异常,什么是不能解决的?
回复 使用道具 举报
import java.io.*;
import java.sql.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class Ex8_4_show extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String sql = "select * from bookITEM";
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
res.setContentType("text/html");
ServletOutputStream sos = res.getOutputStream();
PrintWriter out = new PrintWriter(sos, true);
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con = DriverManager.getConnection("jdbc:odbc:BOOK");
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int numcols = rsmd.getColumnCount();
out.println("<HTML>");
out.println("<HEAD><TITLE>bookdb</TITLE></HEAD>");
out.println("<BODY>");
out.println("<TABLE>");
out.println("<TR>");
for (int i = 1; i <= numcols; i++)
out.println("<TH>" + rsmd.getColumnLabel(i));
out.println("</TR>\n");
while (rs.next()) {
out.println("<TR>");
for (int i = 1; i <= numcols; i++) {
out.println("<TD>");
Object obj = rs.getObject(i);
if (obj != null)
out.println(obj.toString());
else
out.println("&nbsp;");
}
out.println("</TR>\n");
}
out.println("</TABLE>\n");
out.println("</BODY></HTML>");
} catch (ClassNotFoundException e) {
out.println("Can't load Dbase driver:" + e.getMessage());
}
catch (SQLException ignored) {
}
finally {

if (con != null)
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}

}
}
}
回复 使用道具 举报
在可能会出现exception的地方,要使用try-catch或者throws或者两者都要。我的判定依据是:假如对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-catch掉这个exception;假如希看外部知道,则在catch到之后把exception直接抛出或者抛出自定义的exception。   

处理意外的一个重要原则,就是要么处理,要么接着抛,决不能吃掉,这就是说,当你捕捉一个异常之后,必须决定是否立即处理这个异常,或者继续抛出这个异常(或者另一个自定义异常),以便由调用的客户端捕捉之。当客户端捕捉到以后,又会继续进行类似的判定。

除非你想把异常处理的责任交给调用者,一般不用throws。 比如你要读进一些文件,假如你想通知调用者,让调用者决定如何处理这个异常,你就把这个异常throws给调用者;假如你知道应该如何处理这个异常,或者你想把异常马上解决,你可以就地catch她。

这完全取决于你想把异常自己立即处理还是想把处理责任返回给调用者。取决于你的程序的结构和要求。   
需要留意的有:
1、假如无法处理某个异常,那就不要捕捉它。   
2、假如捕捉了一个异常,请不要胡乱处理它。   
3、尽量在靠近异常被抛出的地方捕捉异常。   
4、在捕捉异常的地方将它记录到日志中,除非您打算将它重新抛出。   
5、按照您的异常处理必须多精细来构造您的方法。   
6、需要用几种类型的异常就用几种,尤其是对于应用程序异常
回复 使用道具 举报
声明异常:
  调用了一个声明异常(受查检)的方法,我们需要被动的给当前方法声明异常!当然,这不是唯一的选择!我们还可以处理了这个异常!

当子类(现实类)重写父类(接口)中的方法时,不能声明父类(接口)中方法没有声明的异常!
重写时,父类声明了异常,但子类可以不声明(声明的异常可以越来越少),但不能声明父类方法中没有声明的异常!

声明异常是定义方法的一部分!
定义方法可以分为两大部分:一是做什么(方法的原型)、另一个是怎么做(方法体内容)
其中声明异常属于方法的原型中。
方法的原型就相当于是给使用者说明书!
1 声明异常的语法
public static String fun() throws Excepiton1[, Exception2…] {}


2 声明异常的方法说明什么
  当一个方法声明了异常,说明这个方法有可能返回异常类的对象,但正常情况下还是返回声明的返回值。

3 调用声明异常的方法
        对受检查异常而言只有两条路可选:要么处理了这个异常,要么在你的方法中也声明相同的异常。
        对不受检查的异常而言就无所谓了,调用了不受检查的异常,没看见一样。

4 main也可以声明异常
这个大家可以放心,main同样也可以声明异常!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马