如何在不调用所述方法的情况下从 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
}
}
我正在编写一个小型音频播放器,需要帮助; 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
}
}