如何在不调用所述方法的情况下从 java 中的方法获取变量?

How can I get a variable from a method in java without invoking said method?

我正在编写一个小型音频播放器,需要帮助; fopen() 方法由另一个 class 中的按钮按下调用(不是这里的问题);问题是如果不调用该方法,我就无法将文件的路径作为字符串获取。

playsound() 方法需要来自 fopen() 的文件路径变量,如果我使用字符串 'path'(在 fopen() 之后初始化),它会再次调用该方法。

我只需要 'filepath' 变量,但我无法在 fopen() 之外访问它,或者至少我不知道。关于如何在不调用 fopen() 的情况下访问文件路径的帮助?

编辑:固定 fopen() 被设置为 return a 'File' 而不是字符串。也对代码做了一些改动;在不应该调用 fopen() 时调用 fopen() 的问题已修复,但现在它给了我一个 java.io.FileNotFoundException: 当我调用 playsound() 时(据我所知,这意味着文件的路径 and/or 甚至没有记录名字)。这里还有什么事?

编辑 2:我只想问另一个问题,因为手头的问题似乎已经得到解答,而我手头上有一个完全不同的问题。

package mediaz;
import javazoom.jl.player.*;
import javax.swing.filechooser.*;
import java.io.*;
import javax.swing.JFileChooser;


public class audio { 
private String lastfilepath = "";
public String fopen(){
    JFileChooser fc= new JFileChooser();
    FileNameExtensionFilter filtermp3 = new FileNameExtensionFilter("MPEG-2
    Audio Layer III", "mp3");
    fc.setFileFilter(filtermp3);
    int ret = fc.showOpenDialog(null);
if (ret == JFileChooser.APPROVE_OPTION) 
    {
        File file = fc.getSelectedFile();
        String filepath = file.getAbsolutePath();
        this.lastfilepath = filepath;
        return filepath;
    }
else
    return null;
}

String path = fopen();     

void playsound(){

    System.out.println("You pressed play.");
    try{
    FileInputStream fis = new FileInputStream(this.lastfilepath);
    Player playMP3 = new Player(fis);
    playMP3.play();
    }
    catch(Exception e){
    System.out.println("Error: '" + e +"'");
    }
}
//  IGNORE WHAT'S BELOW HERE    //
void rewsound(){
    System.out.println("You pressed rewind.");
    }

void pausesound(){    
    System.out.println("You pressed pause.");
    }

/*    void forwardsound(){
    System.out.println("You pressed fast forward.");
}
*/
}

audio 中创建一个 String 实例变量,然后在调用 fopen() 时将当前选定文件的路径存储在该字符串中。

见下面的代码。未经测试,但想法就在这里。此外,这段代码的格式非常糟糕,难以阅读。这就是它应该的样子(大概)。

编辑:在通用 improvements/coding 样式的代码中添加了一些注释

编辑:有关我在代码中更新的尝试的更多信息,请参阅:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

package mediaz;
import javazoom.jl.player.*;
import javax.swing.filechooser.*;
import java.io.*;
import javax.swing.JFileChooser;


public class audio {
    private String filePath = "";

    public File fopen() {
        JFileChooser fc = new JFileChooser();
        FileNameExtensionFilter filtermp3 = new FileNameExtensionFilter("MPEG-2
            Audio Layer III ", "
            mp3 ");
        fc.setFileFilter(filtermp3); int ret = fc.showOpenDialog(null);
        if (ret == JFileChooser.APPROVE_OPTION) {
            File file = fc.getSelectedFile();
            this.filePath = file.getAbsolutePath()
            return filepath; // should be file
        } else // give me braces please!
            return null;
    }

    // try to stick to camelCase, it is the 'Java' way
    void playsound() { 
        System.out.println("You pressed play.");
        // streams implement AutoCloseable, use it
        // also, you were not closing fis as it was
        try (FileInputStream fis = new FileInputStream(this.filePath)) {
            Player playMP3 = new Player(fis);
            playMP3.play();
        } catch (Exception e) {
            System.out.println("Error: '" + e + "'");
        }
    }
}

您的 fopen() 方法声明为 return 一个 File,但在该方法中您 return 一个字符串。如果您 return 编辑了用户选择的文件,然后将此引用存储在某处,您可以随时询问该文件的路径。

创建另一个方法,returns最后一个文件路径在fopen()中确定,例如:

private String lastFilepath;

public String fopen() {
    // logic for determining filepath
    lastFilepath = filepath;
    return filepath;
}

public String getLastFilepath() {
    return lastFilepath;
}

首先你应该阅读 java 编程中的 scopes

您当前拥有的是变量 "filepath" 的局部作用域。要使其在其方法块之外可访问,您可以 return 将其作为方法结果或将其分配给实例变量。

另外请注意,您的 fopen() 方法目前无法编译,因为它被声明为 return 一个文件,但在内部尝试 return 一个字符串类型。

我会推荐以下内容:

public class foo {
    private String filePath;

    private void readFile() {
        filePath = doReadingHere();
    }

    private void useFilePath() {
        System.out.println(filePath);
        // do what ever you like to do with the instance variable filePath
    }
}