📜  Java中的Java .io.FileNotFoundException

📅  最后修改于: 2022-05-13 01:55:46.376000             🧑  作者: Mango

Java中的Java .io.FileNotFoundException

Java.io.FileNotFoundException这是我们尝试访问文件时发生的常见异常。 FileNotFoundExcetion 由构造函数 RandomAccessFile、FileInputStream 和 FileOutputStream 抛出。 FileNotFoundException 发生在运行时,所以它是一个检查异常,我们可以通过Java代码处理这个异常,我们必须照顾代码,使这个异常不会发生。

宣言 :

public class FileNotFoundException
  extends IOException
    implements ObjectInput, ObjectStreamConstants

构造函数:

  • FileNotFoundException() :它给 FileNotFoundException 提供空消息。
  • FileNotFoundException(String s) :它给出带有详细消息的 FileNotFoundException。

它没有任何方法。现在让我们了解这个类的层次结构,即 FileNotFoundException 扩展了 IOException,它进一步扩展了 Exception 类,它扩展了 Throwable 类,并进一步扩展了 Object 类。

层次图:

为什么会出现这个异常?

FileNotFoundException 发生时主要有2 种情况。现在让我们通过提供的示例来查看它们:

  1. 如果给定文件在给定位置不可用,则会发生此错误。
  2. 如果给定的文件不可访问,例如,如果它是只读的,那么您可以读取该文件但不能修改该文件,如果我们尝试修改它,则会发生错误,或者如果您尝试访问该文件读/写操作被另一个程序打开,那么这个错误就会发生。

场景一:

如果给定文件在给定位置不可用,则会发生此错误。

例子:

Java
// Java program to illustrate 
// FileNotFoundException 
  
// All output and input streams 
// are available in java.io package
import java.io.*;
  
public class Example1 
{
  public static void main(String[] args) 
  {
         
    // creating object of FileReader
    FileReader reader = new FileReader("file.txt");
      
    // passing FileReader to
    // buffered reader
    BufferedReader br = new BufferedReader(reader);
      
    // declaring empty string 
    String data =null;
      
    // while loop to read data 
    // and printing them
    while ((data = br.readLine()) != null) 
    {
        System.out.println(data);
    }
      
    // closing the object
    br.close();
  }
}


Java
// Java program to illustrate 
// FileNotFoundException 
  
// All output and input streams 
// are available in java.io package
import java.io.*;
import java.util.*;
  
class Example2 {
  public static void main(String[] args) {
      
    // starting try block
    try {
        // Opening the file
          File f=new File("file.txt");   
            
          // creating printWriter object
          // by intiating fileWriter 
        PrintWriter p1=new PrintWriter(new FileWriter(f), true);
            
          // printing sample text
        p1.println("Hello world");
          p1.close();
        
          // changing the file operation 
          // to read-only 
        f.setReadOnly();
        
          // trying to write to new file
          PrintWriter p2=new PrintWriter(new FileWriter("file.txt"), true);
        p2.println("Hello World");
    }
      
    // catching exception thrown
    // by try block
    catch(Exception ex) {
        ex.printStackTrace();
    }
  }
}


输出

prog.java:14: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
    FileReader reader = new FileReader("file.txt");
                        ^
prog.java:25: error: unreported exception IOException; must be caught or declared to be thrown
    while ((data = br.readLine()) != null) 
                              ^
prog.java:31: error: unreported exception IOException; must be caught or declared to be thrown
    br.close();
            ^
3 errors

场景2:

如果给定的文件不可访问,例如,如果它是只读的,那么您可以读取该文件但不能修改该文件,如果我们尝试修改它,则会发生错误,或者如果您尝试访问的文件读/写操作被另一个程序打开,那么就会发生这个错误。

例子:

Java

// Java program to illustrate 
// FileNotFoundException 
  
// All output and input streams 
// are available in java.io package
import java.io.*;
import java.util.*;
  
class Example2 {
  public static void main(String[] args) {
      
    // starting try block
    try {
        // Opening the file
          File f=new File("file.txt");   
            
          // creating printWriter object
          // by intiating fileWriter 
        PrintWriter p1=new PrintWriter(new FileWriter(f), true);
            
          // printing sample text
        p1.println("Hello world");
          p1.close();
        
          // changing the file operation 
          // to read-only 
        f.setReadOnly();
        
          // trying to write to new file
          PrintWriter p2=new PrintWriter(new FileWriter("file.txt"), true);
        p2.println("Hello World");
    }
      
    // catching exception thrown
    // by try block
    catch(Exception ex) {
        ex.printStackTrace();
    }
  }
}

输出

java.security.AccessControlException: access denied ("java.io.FilePermission" "file.txt" "write")
    at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.base/java.security.AccessController.checkPermission(AccessController.java:897)
    at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:322)
    at java.base/java.lang.SecurityManager.checkWrite(SecurityManager.java:752)
    at java.base/java.io.FileOutputStream.(FileOutputStream.java:225)
    at java.base/java.io.FileOutputStream.(FileOutputStream.java:187)
    at java.base/java.io.FileWriter.(FileWriter.java:96)
    at Example2.main(File.java:19)

处理异常:

首先,如果我们知道是否会发生错误,我们必须使用 try-catch 块。如果有可能出错,在 try 块中所有行都应该在那里。还有其他补救措施可以处理异常:

  1. 如果异常的消息表明没有这样的文件或目录,那么您重新验证您是否在该目录中存在程序或文件中提到了错误的文件名。
  2. 如果异常消息告诉我们访问被拒绝,那么我们必须检查文件的权限(读、写、读和写),并检查该文件是否正在被另一个程序使用。
  3. 如果异常消息告诉我们指定的文件是一个目录,那么您必须删除现有目录(如果该目录未使用)或更改文件名。