import java.io.*;public class niu
{
    public static void main(String[] args)
    {
        String path="e:/insert.c";
        File fs=new File(path);
        System.out.println(fs.getName());//正常输出insert.c
        
        FileInputStream fis = new FileInputStream(fs);//为什么此处会抛出异常java.io.FileNotFoundException        
    }
}直接 FileInputStream fis = new FileInputStream("e:/insert.c");也会抛出文件未找到异常,求解释。。

解决方案 »

  1.   

    这个函数显示的抛出了异常,你就必须显示的catch这个异常。加上try catch块就行了。呵呵,测试文件是否存在也不一定管用。IO一般都会抛出异常,都放到try catch块里面。
      

  2.   

    jdk api中原文如下:抛出:
        FileNotFoundException - 如果该文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取。 其他原因无法读取?
      

  3.   

    文件是存在的,你可以看下这个API中方法的定义:FileInputStreampublic FileInputStream(File file)
                    throws FileNotFoundException    通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。创建一个新 FileDescriptor 对象来表示此文件连接。    首先,如果有安全管理器,则用 file 参数表示的路径作为参数调用其 checkRead 方法。    如果指定文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取,则抛出 FileNotFoundException。    参数:
            file - 为了进行读取而打开的文件。 
        抛出:
            FileNotFoundException - 如果该文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取。 
            SecurityException - 如果存在安全管理器,且其 checkRead 方法拒绝对文件进行读取访问。
        另请参见:
            File.getPath(), SecurityManager.checkRead(java.lang.String)JDK在定义这个构造器的时候就已经向上抛了FileNotFoundException异常了,而调用它的构造器也必须要抛出异常.仅此而已.如果是在JDK中原本用try{}catch(){}这样定义的异常,就不必再往上抛了..
      

  4.   

    改成e:\\insert.c看看,同时,还需要看下你是否拥有对insert.c的可读写权限import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;public class MyTest {
        public static void main(String[] args){
                String path="e:\\insert.c";
                //String path="e:\\insert.txt";如果.c文件找不到,试一下换成insert.txt
                File fs=new File(path);
                System.out.println(fs.getName());//正常输出insert.c            try{
                    FileInputStream fis = new FileInputStream(fs);
                }catch(IOException e){
                    e.printStackTrace();
                }        }}
      

  5.   

    改成"e:\\insert.c"也不行,text文件也不行。悲剧了。
      

  6.   

    public FileInputStream(File file)
                    throws FileNotFoundException这个函数声明的时候,已经说了,他会抛出一个异常,所以你必须catch这个异常。这是语言的一个防御机制。即告诉使用者,这里很有可能会出错。你必须注意。其实即使你测试了文件存在,也有可能测试完的一瞬间这个文件被删除了。
      

  7.   

    有可能e盘下面不存在insert.c文件 而是insert .c 多了一个空格,或者insert.c.txt文件
    加我QQ帮你看下吧,519582737
      

  8.   

    不好意思啊,明白了,只是不明白的是为什么无论如何都要抛出一个异常呢?为了强制程序员写try catch?
      

  9.   

    我加上catch就行了
    jdk 原文是这样的啊FileInputStreampublic FileInputStream(File file)
                    throws FileNotFoundException    通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。创建一个新 FileDescriptor 对象来表示此文件连接。    首先,如果有安全管理器,则用 file 参数表示的路径作为参数调用其 checkRead 方法。    如果指定文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取,则抛出 FileNotFoundException。    参数:
            file - 为了进行读取而打开的文件。 
        抛出:
            FileNotFoundException - 如果该文件不存在,或者它是一个目录,而不是一个常规文件,抑或因为其他某些原因而无法打开进行读取。 
    不存在才抛出异常啊,不是肯定要抛出的吧,那为什么我加上catch就可以了呢,而且我还能读取文件的内容。
      

  10.   

    问题解决了么?写try-catch能够让程序更加健壮,对于网络、本地文件这样的资源引用,JAVA都强制要求try-catch
      

  11.   

    对,就是强制程序员必须catch。呵呵,这是语言的防御机制。
      

  12.   

    E:\javacode\niu.java:13: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
                    FileInputStream fis = new FileInputStream(fs);提示的错误确实如此,不过为什么和jdk api 文档上说的意思不一样呢?
      

  13.   

    我终于明白了,就是不一定会抛出,但是你必须要catch,以防万一。。
    感谢二位
      

  14.   

    意思一样,用的措辞不同而已,你知道这么样做就OK了,不必太在意编译器的说法和JDK文档的说法细节上的差别问题解决了结贴就行了