我一直在研究一个程序,它读取一个文件然后找到所有的X并将它们返回为0,这样我就可以在我的完整程序中使用它。
到目前为止,我在转换为字符串方面遇到了很多问题。我目前收到错误消息:
线程“main”中的异常java.lang.Error:未解决的编译问题: 此方法必须返回String
类型的结果这是我的代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
public class ReadMagicSquare {
public static String Replace(String filename) {
try {
Scanner file = new Scanner(new File(filename));
System.out.println(file);
StringBuilder b = new StringBuilder();
String s = "";
int n = 0;
while(file.hasNextLine()){
s = file.nextLine();
n++;
if (s == "X") {
s = "0";
b.append(s).append(System.getProperty("line.separator"));
return b.toString();
} else {
return b.toString();
}
}
} catch (Exception e) {
}
}
static int[][] matrix;
int size = -1;
int log10 = 0;
String numberFormat;
public ReadMagicSquare(String filename) {
try {
readFile("test1.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
public void readFile(String filename) throws IOException {
BufferedReader John= new BufferedReader(new FileReader("test1.txt"));
String line;
int j = 0;
while ((line = John.readLine()) != null) {
String[] vals = line.trim().split("\\s+");
if (matrix == null) {
size = vals.length;
matrix = new int[size][size];
log10 = (int) Math.floor(Math.log10(size * size)) + 1;
numberFormat = String.format("%%%dd", log10);
}
for (int i = 0; i < size; i++) {
matrix[j][i] = Integer.parseInt(vals[i]);
}
j++;
}
}
public String toString() {
StringBuffer John1 = new StringBuffer();
if (matrix != null) {
for (int j = 0; j < size; j++) {
John1.append(" ");
for (int i = 0; i < size; i++) {
John1.append(String.format(numberFormat, matrix[j][i]));
}
if (j < size - 1) {
John1.append("\n");
} else {
John1.append("");
}
}
}
return John1.toString();
}
public static void main(String[] args) {
Replace("test1.txt");
ReadMagicSquare square = new ReadMagicSquare("square.txt");
System.out.println(square.toString());
System.out.println(matrix[3][0]);
}
}
你们有谁知道原因可能是什么?谢谢你的时间!
编辑:
非常感谢您的投入!我做了以下更改但仍有问题:
public static String Replace(String filename) {
try {
Scanner file = new Scanner(new File(filename));
System.out.println(file);
StringBuilder b = new StringBuilder();
String s = "";
int n = 0;
while(file.hasNextLine()){
s = file.nextLine();
n++;
if (s.equals("X")) {
s = "0";
b.append(s).append(System.getProperty("line.separator"));
b.toString();
} else {
return b.toString();
}
}
} catch (Exception e) {
return null;
}
try (PrintStream out = new PrintStream(new FileOutputStream("test1,1.txt"))) {
out.print(b);
}
}
我现在有out.print(b)的问题;线。它给了我错误:
b无法解析为变量
这对我来说是新的。有人愿意详细说明吗?
编辑2:
我现在已经解决了我的大部分问题,但是当我尝试运行该程序时,它并没有改变.txt文件中的X.我得到相同的输出,而我希望所有的X都变为0.我现在有了这个代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;
public class ReadMagicSquare {
static int[][] matrix;
int log10 = 0;
String numberFormat;
String line;
int j = 0;
int size = 0;
public static String Replace(String filename) {
try {
Scanner file = new Scanner(new File(filename));
System.out.println(file);
StringBuilder b = new StringBuilder();
String s = "";
while(file.hasNextLine()){
s = file.nextLine();
if (s.equals("X")) {
s = "0";
b.append(s).append(System.getProperty("line.separator"));
} else {
b.append(s).append(System.getProperty("line.separator"));
}
}
try (PrintStream out = new PrintStream(new FileOutputStream("test1,1.txt"))) {
out.print(b);
out.close();
} catch (IOException e) {
}
} catch (Exception e) {
System.out.println("Problem reading file.");
}
return "bobby";
}
public ReadMagicSquare(String filename) {
try {
readFile("test1,1.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
public void readFile(String filename) throws IOException {
BufferedReader buffer = new BufferedReader(new FileReader("test1,1.txt"));
while ((line = buffer.readLine()) != null) {
String[] vals = line.trim().split("\\s+");
if (matrix == null) {
size = vals.length;
matrix = new int[size][size];
log10 = (int) Math.floor(Math.log10(size * size)) + 1;
numberFormat = String.format("%%%dd", log10);
}
for (int i = 0; i < size; i++) {
matrix[j][i] = Integer.parseInt(vals[i]);
}
j++;
}
}
public String toString() {
StringBuffer buff = new StringBuffer();
if (matrix != null) {
for (int j = 0; j < size; j++) {
buff.append(" ");
for (int i = 0; i < size; i++) {
buff.append(String.format(numberFormat, matrix[j][i]));
}
if (j < size - 1) {
buff.append("\n");
} else {
buff.append("");
}
}
}
return buff.toString();
}
public static void main(String[] args) {
Replace("test1.txt");
ReadMagicSquare square = new ReadMagicSquare("square.txt");
System.out.println(square.toString());
System.out.println(matrix[3][0]);
}
}
有谁知道导致问题的原因是什么?
答案 0 :(得分:2)
我现在有out.print(b)的问题;线。它给了我错误:
b无法解析为变量
这对我来说是新的。有人愿意详细说明吗?
那是因为你无法访问catch块中try块内部声明的变量,只需在try块之前移动变量声明(你仍然可以在try块中初始化它)。
这是针对同一问题的另一个问题https://stackoverflow.com/a/2854153/1935341
答案 1 :(得分:1)
在Replace
中,您没有在所有情况下返回String(或null)
如果有异常或文件没有内容,则不返回任何值。
其次,您可能想要检查您应该何时返回的逻辑。目前,如果s == "X"
,您将返回。顺便说一句,这不是测试字符串相等性的正确方法。
答案 2 :(得分:1)
捕获异常时必须返回一些东西(String对象或null),或者向方法签名添加异常而不是捕获它。