我使用FindBugs并且此错误不断生成:
依赖于默认编码:
发现对一个方法的调用,该方法将执行字节到String(或String to byte)转换,并假设默认平台编码是合适的。 这将导致应用程序行为因平台而异。使用备用API并明确指定charset名称或Charset对象。
我认为这与扫描仪有关,这是我的代码:
package mystack;
import java.util.*;
public class MyStack {
private int maxSize;
private int[] stackArray;
private int top;
public MyStack(int s) {
maxSize = s;
stackArray = new int[maxSize];
top = -1;
}
public void push(int j) {
stackArray[++top] = j;
}
public int pop() {
return stackArray[top--];
}
public int peek() {
return stackArray[top];
}
public int min() {
return stackArray[0];
}
public boolean isEmpty() {
return (top == -1);
}
public boolean isFull() {
return (top == maxSize - 1);
}
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
char end;
System.out.println("Please enter the size of the Stack: ");
int size=read.nextInt();
MyStack stack = new MyStack(size);
do{
if(stack.isEmpty()){
System.out.println("Please fill the Stack: (PUSH) \nBecause Stack is Empty.");
int add;
for(int i=0; i<size; i++)
{add=read.nextInt();
stack.push(add);}
}//End of if
else if(stack.isFull()){
System.out.println("Do you want to 1)POP 2)Know the Peek 3)Know the Min");
int option=read.nextInt();
if(option==1)
stack.pop();
else if (option==2)
System.out.println("The Peek= "+stack.peek());
else if (option==3)
System.out.println("The Min= "+stack.min());
else System.out.println("Error, Choose 1 or 2 or 3");
}//End of if
else
{ System.out.println("Do you want to 1)POP 2)Know the Peek 3)Know the Min 4)PUSH");
int option=read.nextInt();
if(option==1)
stack.pop();
else if (option==2)
System.out.println("The Peek= "+stack.peek());
else if (option==3)
System.out.println("The Min= "+stack.min());
else if(option==4)
{int add=read.nextInt();
stack.push(add);}
}//end else
System.out.print("Stack= ");
for(int i=0; i<=stack.top; i++)
{ System.out.print(stack.stackArray[i]+" ");}
System.out.println();
System.out.println();
System.out.println("Repeat? (e=exit)");
end=read.next().charAt(0);
System.out.println();
}while(end!='e');
System.out.println("End Of Program");
}//end main
}//end MyStack
显然这是一个堆栈,工作正常。
答案 0 :(得分:4)
FindBugs担心默认的字符编码。如果您在Windows下,则默认字符编码可能是“ISO-8859-1”。如果你在Linux下,它可能是“UTF-8”。如果你在MacOS下,你可能正在使用“MacRoman”。您可以在charset encodings上阅读更多内容,然后点击链接,在available encodings in Java上了解详情。
特别是,此行使用默认平台编码从控制台读取文本:
Scanner read = new Scanner(System.in);
为确保代码在不同环境中的工作方式相同,FindBugs建议您将其更改为
Scanner read = new Scanner(System.in, "UTF-8");
(或您最喜欢的编码)。这将保证,给定一个使用编码“UTF-8”的输入文件,无论您执行程序的机器是什么,它都将以相同的方式进行解析。
在您的情况下,您可以安全地忽略此警告,除非您有兴趣将文本文件提供给您的应用程序。
答案 1 :(得分:1)
FindBugs检测到您的Scanner对象使用默认编码来解析InputStream。通常,最好像new Scanner(someInputStreamFromFile, "UTF-8")
一样明确地设置编码,以便在不同的环境中具有相同的解析结果。但不是在你的情况下,因为你读取System.io并且没有可靠的方法来检测控制台编码。详情请见java console charset translation。
答案 2 :(得分:1)
当您从控制台阅读时,您可以ignore this warning:
@SuppressFBWarnings(
value = "DM_DEFAULT_ENCODING",
justification = "It's fine for console reads to rely on default encoding")
这种抑制应该是有意义的。我们可能会使用例如Windows中的UTF-8控制台,然后我们不应该依赖new Scanner(System.in);
中的默认编码。