import java.io.*;
public class TestCharsetExa 
{
  public static void main(String[] args)
  { String file = "D:/test.txt";
    String charset = "UTF-8";
    FileOutputStream outputStream = new FileOutputStream(file); 
    OutputStreamWriter writer = new OutputStreamWriter(outputStream, charset); 
    try 
     { writer.write("这是要保存的中文字符"); 
     } 
    finally 
     { writer.close();      } 
   FileInputStream inputStream = new FileInputStream(file); 
   InputStreamReader reader = new InputStreamReader( inputStream, charset); 
   StringBuffer buffer = new StringBuffer();
   char[] buf = new char[64]; 
   int count = 0; 
   try 
    {
     while ((count=reader.read(buf))!=-1)
      { buffer.append(buf, 0, count); 
      } 
    } 
   finally 
    { reader.close(); 
    }
  }
 }
这儿是一个字符输入输出流,错误提示是没有捕捉异常。在try-catch一定得一起用才能捕获异常吗?finally一般是在什么异常情况下用???

解决方案 »

  1.   

    没有catch就等于没有实际对异常进行处理,非RuntimeException要么必须catch,要么必须在主调函数上声明throws,也就是继续往外面抛。所以经常有人写main()函数是这么写的:
    public static void main(String[] args) throws Exception
    然后里面就可以尽情的偷懒了。
    finally主要是为了防范RuntimeException而导致关键代码没有执行,finally不负责处理异常。
      

  2.   

    finally是不管出不出最后都要进行的处理,一般放置关键代码。
      

  3.   

    public int getNumber(String str)
    { if(str==null)new NullException("参数不能为空")
      if(str.equals("A"))return 1;
      if(str.equals("B"))return 2;}很多异常都是在方法后申明,在try-catch中捕获,上面的代码在方法里实例化异常类
    它能保证出现异常时结束方法,转到catch块中这个就是楼上所说的RunTimeExcption
    异常的处理吗?这和只在方法后面申明异常不在方法里实例化异常有什么区别??
      

  4.   

    try{
    }catch(Exception e){
    }finally{
    }try 与catch要一起用的,如果该方法存在可捕获异常,则需要显示捕获。如果是运行时异常,比如runtimeException,可以捕获,也可以不捕获,但是如果可能存在如下情况,最后,自己强制去捕获一下。
    try 代码块中,表示执行代码,一旦出现异常 如果没有抛出,而是选择,捕获的话,则会执行catch中的方法。所以,如果没有catch 那么try 是毫无意义的。至于finally 中的代码,则表示在方法无论是正常结束,还是异常结束,都会去强制执行
      

  5.   

    像运行异常时,如果不捕获,程序就不能完整运行,捕获异常时需实例化异常的对象,像例中if(str==null)new NullException("参数不能为空")这种形式,运行异常的捕获和一般的捕获有什么区别
     
      

  6.   

    if(str==null)new NullException("参数不能为空")
    这个就好过你后面程序算个半死,然后才出个神奇的错误。其实对于运行时异常和常规异常的使用上,业界一直也有很大的争议:
    ◎ 有人主张不声明任何常规异常,理由是既然你声明异常,说明是你预料之内的,那就不是异常,只是一种特殊的返回结果;如果是意料之外的,那就应该用运行时异常。
    ◎ 有人主张只要是预料之中的就应该声明异常,参数检查等都应该用异常规范好(类似于 assert );程序根本就不应该发出运行时异常,运行时异常只能是环境或平台来产生。
    各有合理性,难以决断谁就更有优势。