Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:递归地写入文件_Java_Recursion - Fatal编程技术网

Java:递归地写入文件

Java:递归地写入文件,java,recursion,Java,Recursion,好的,这是我的情况: 我有一个递归函数,它计算并打印一些东西到屏幕上。现在我需要将该输出保存到一个文件中 所以我这样做了: public void recursiveFn(int value) throws FileNotFoundException { recursiveFn(a); PrintWriter fileOP = new PrintWriter("file.txt") fileOp.printf(somevaluefromthisfunction) }

好的,这是我的情况:

我有一个递归函数,它计算并打印一些东西到屏幕上。现在我需要将该输出保存到一个文件中

所以我这样做了:

public void recursiveFn(int value) throws FileNotFoundException {
     recursiveFn(a);
     PrintWriter fileOP = new PrintWriter("file.txt")
     fileOp.printf(somevaluefromthisfunction)
}
这种方法的问题是,每次递归调用该函数时,都会创建一个新文件,并删除以前所有的递归调用数据

现在我的方法是让文件在这个函数之外创建。这就是我所做的:

public class MyClass {
      PrintWriter fileOP = new PrintWriter("file.txt") //line 2

      public void recursiveFn(int value) {
         recursiveFn(a);
         fileOp.printf(somevaluefromthisfunction)
    }
}

这有什么问题吗?我在第2行遇到错误:“未处理的异常类型FileNotFoundException”。在调试这个错误的过程中,我几乎掉了5%的头发

在构造函数中设置fileOP:

public class MyClass {
      PrintWriter fileOP; //line 2

      public void recursiveFn(int value) {
         recursiveFn(a);
         fileOp.printf(somevaluefromthisfunction)
    }
    public MyClass(){
         try{
             fileOP = new PrintWriter("file.txt");
         } catch (FileNotFoundException e){
             // do whatever you need to do to handle it
         }

    }
}
您还可以在递归定义中传递printwriter:

public void recursiveFn(PrintWriter fOP, int a) throws FileNotFoundException {
    recursiveFn(fOP, a);

    fOP.printf(someFunc(a));
}

我猜您可能希望将函数的递归稍微调整为逻辑的,而不是无限的。

问题是,变量初始化可能会引发您必须处理的异常。其他人则展示了几种不同的处理方法。IMO认为,最好的方法是设置递归方法所需的所有内容(如PrintWriter),然后调用递归方法

public class MyClass {
    public void doSomething(int value) {
        PrintWriter fileOP = new PrintWriter("file.txt");
        this.recursiveFn(value,fileOP);
    }
    public void recursiveFn(int value,PrintWriter fileOp) {
         int a = value + 1; // Or whatever
         recursiveFn(a,fileOp);
         fileOp.printf(somevaluefromthisfunction);
    }
}

如果使用IDE,它可以通过让被调用方处理此异常来自动修复此编译错误。调试器只对编译的代码有用。@PeterLawrey IDE通常对某些类型的语法或语言错误无效。@hexafraction或某些IDE无效。IntelliJ几乎修复了我遇到的所有语法错误,尽管您仍然需要检查修复是否有意义。我经常编写不可编译的代码,因为我知道IntelliJ会在我打字时从我这里修复它。@PeterLawrey这是一个无论如何我都不喜欢依赖的工具。修复语言错误,比如缺少捕获,或者为我创建方法?我很感激。我更喜欢自己做大括号:)@Hexafrance完全同意大括号,因为我避开了它们@我没有对你投下反对票,但我有一种感觉,那是因为你没有回答这个问题,在你的答案中提供了语法上不正确的代码。“你不可能拒绝我,因为我不是这个答案的作者:”我写下了另一个答案。我正处于中间位置,被切断了。我现在正在编辑。@Oopsies,我的道歉@不用担心!