У меня возникли трудности со следующим методом. Я не могу понять, в чем моя проблема, но я сузил ее до того, чтобы не заполнять список массивов из файла. Любая помощь приветствуется.
private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {
//create arraylists
ArrayList<String> model = new ArrayList<String>();
ArrayList<String> length = new ArrayList<String>();
ArrayList<String> width = new ArrayList<String>();
ArrayList<String> radius = new ArrayList<String>();
ArrayList<String> depth = new ArrayList<String>();
ArrayList<String> volume = new ArrayList<String>();
ArrayList<String> shape = new ArrayList<String>();
//fill arraylists from file
try {
String outputline = "";
BufferedReader fin = new BufferedReader(new FileReader("stock.dat"));
while((outputline = fin.readLine()) != null) {
// for(int i = 0; i < outputline.length(); i++) {
int i = 0;
//model
boolean flag = false;
String pass = "";
while(flag = false) {
if (outputline.charAt(i) != ',')
pass.concat(Character.toString(outputline.charAt(i)));
else
flag = true;
i++;
}
model.add(pass);
//length
flag = false;
pass = "";
while(flag = false) {
if (outputline.charAt(i) != ',')
pass.concat(Character.toString(outputline.charAt(i)));
else
flag = true;
}
length.add(pass);
//width
flag = false;
pass = "";
while(flag = false) {
if (outputline.charAt(i) != ',')
pass.concat(Character.toString(outputline.charAt(i)));
else
flag = true;
}
width.add(pass);
//radius
flag = false;
pass = "";
while(flag = false) {
if (outputline.charAt(i) != ',')
pass.concat(Character.toString(outputline.charAt(i)));
else
flag = true;
}
radius.add(pass);
//depth
flag = false;
pass = "";
while(flag = false) {
if (outputline.charAt(i) != ',')
pass.concat(Character.toString(outputline.charAt(i)));
else
flag = true;
}
depth.add(pass);
//volume
flag = false;
pass = "";
while(flag = false) {
if (outputline.charAt(i) != ',')
pass.concat(Character.toString(outputline.charAt(i)));
else
flag = true;
}
volume.add(pass);
//shape
pass = "";
for(int j = i; j < outputline.length(); j++)
pass.concat(Character.toString(outputline.charAt(i)));
shape.add(pass);
}
fin.close();
}
catch(IOException e) {
System.err.print("Unable to read from file");
System.exit(-1);
}
int at = -1;
for(int i = 0; i < model.size(); i++) {
if (model.get(i).equals(searchIn.getText())) {
at = i;
i = model.size();
}
}
Component frame = null;
if (at != -1) {
searchDepthOut.setText(depth.get(at));
searchLengthOut.setText(length.get(at));
searchRadiusOut.setText(radius.get(at));
searchVolumeOut.setText(volume.get(at));
searchWidthOut.setText(width.get(at));
}
else
JOptionPane.showMessageDialog(null, "Your search did not return any results", "ERORR", JOptionPane.ERROR_MESSAGE);
}
Прошу прощения за это, но опубликованный вами код просто ужасен и требует отчаянного рефакторинга. Создайте класс для представления 7 свойств вместо 7 параллельных массивов и используйте String.split для анализа списка, разделенного запятыми.




Помимо всех других проблем, которые люди перечислили ...
String pass = "";
while(flag = false) {
if (outputline.charAt(i) != ',')
pass.concat(Character.toString(outputline.charAt(i)));
pass - это строка. Строки неизменны. Ты хочешь
pass = pass.concat(.....)
Разделите строку чтения запятой и покончим с этим. Я бы также создал объект для модели, длины, ширины и т. д., А затем имел бы 1 массив этого объекта.
while((outputline = fin.readLine()) != null) {
String[] tokens = outputline.split(",");
if (tokens.length == 7){
SObj o = new SObj; //Some Object
o.model = tokens[0];
o.length = tokens[1];
//and so on
oList.add(o);
}
}
while(flag = false) никогда не будет запущен - он всегда оценивается как false. Попробуйте while (!flag)
Ответственные IDE должны пометить это назначение как логическое в условном.
IDE предназначены для облегчения работы, а не для повторного предположения кода. Это вполне допустимое условие, которое может быть здесь специально.
Я предлагаю вам реструктурировать код. Проблема не только в том, что есть какая-то ошибка парсера, но и в том, что трудно сказать, что происходит - код явно делает предположения о структуре входной строки, но вам нужно как бы прочитать и отследить способ реструктурировать это в вашем сознании.
Что-то вроде
/** Expect a line of the form model, length, ...,
return a list of ...
*/
private String[] parse (String inputLine)
{
//check input line charachteristics-not null, length, ...
String out= inputLine.split(",");
if (out.length()!= ...
//whatever sanity checking...
}
private List<String[]> extract(BufferedReader fin)
{
while((outputline = fin.readLine()) != null)
{
//do something with parse(outputline);
}
}
Полезно будет разделить чтение файла и синтаксический анализ строки, чтобы вместо того, чтобы делать все это в длинной последовательности, вы могли видеть, что ломается, скорее всего, предположение о структуре строк, которое скрыто в коде. Нужны ли ему 4 целых числа, разделенных запятыми? 5? как насчет того, чтобы они были заполнены пробелами? с префиксом пустой строки?
Не могли бы вы выложить содержимое stock.dat. Если он длинный, не могли бы вы выделить линии, вызывающие проблему. Не могли бы вы рассказать нам, каково желаемое поведение?