Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458

Вызов метода в main

12.04.2013, 19:19. Показов 3471. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет,вот одна проблемка возникла,как тут получить результат:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package org;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashSet;
import java.util.Set;
 
public class OopTest {
 
    public static void main(String[] args) throws FileNotFoundException {
        String Listtest = Tslist(null, null, null, null);
        System.out.println("All main:" + Listtest);
 
    }
 
    public static String Tslist(File file, BufferedReader br,
            HashSet<String> hs, String line) {
        file = new File("C:\\test.txt");
        try {
            br = new BufferedReader(new FileReader(file));
 
            while ((line = br.readLine()) != null) {
                System.out.println("All: " + line);
            }
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return line;
    }
 
}
Как видите там написано return line;,но у меня line только тут
Java
1
2
3
 while ((line = br.readLine()) != null) {
                System.out.println("All: " + line);
            }
Приобретает значения,т.е тут
Java
1
2
String Listtest = Tslist(null, null, null, null);
        System.out.println("All main:" + Listtest);
выведется null(проверено))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.04.2013, 19:19
Ответы с готовыми решениями:

Вызов метода main
Здравствуйте! Как вызвать метод main из другого пакета на кнопку?

Невозможно передать ArrayList в аргументы метода без модификатора static у этого метода или метода main
Крч, хочу передать экземпляр класса ArrayList в метод, но ide говорит, что нельзя это сделать, пока сам метод или main не будут в...

Параметры метода main()
всегда писал public static void main(String args) не задумываясь. Потом заметил, что пишут public static void main(String args) , public...

14
18 / 18 / 2
Регистрация: 16.04.2013
Сообщений: 58
16.04.2013, 15:26
while ((line = br.readLine()) != null) {
System.out.println("All: " + line);
}
В этом цикле line "перекрывает" (почитайте про области видимости переменных, а ещё лучше не используйте "козы", не представляя как они работают), тот параметр, что был передан в метод. По завершении цикла в теле метода используется переменная line, которую вы в него передавали (т.е. null), нулл же и возвращается.
Да и код перегружен ненужными параметрами (file, в итоге всё равно создаётся новый).
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
19.04.2013, 11:05
Цитата Сообщение от Madonion Посмотреть сообщение
В этом цикле line "перекрывает" (почитайте про области видимости переменных, а ещё лучше не используйте "козы", не представляя как они работают), тот параметр, что был передан в метод.
И где объявлена переменная line внутри метода?

Ванеек, вопрос на засыпку. Какое условие выхода из цикла? И чему при этом будет равна переменная line?
2
18 / 18 / 2
Регистрация: 16.04.2013
Сообщений: 58
19.04.2013, 11:17
Я где-то писал, что она объявляется?
В этом цикле line "перекрывает" тот параметр, что был передан в метод.
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
19.04.2013, 11:30
Цитата Сообщение от Madonion Посмотреть сообщение
Я где-то писал, что она объявляется?
В этом цикле line "перекрывает" тот параметр, что был передан в метод.
Переменная перекрывает другую переменную более высокого блока только если она объявлена. В этом коде - ОДНА переменная line. И она только используется в цикле. Никто никого не перекрывает.
1
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
19.04.2013, 13:42  [ТС]
Цитата Сообщение от Skipy Посмотреть сообщение
Ванеек, вопрос на засыпку. Какое условие выхода из цикла? И чему при этом будет равна переменная line?
Ну ,если буфферридер найдет строки,то он присвоит их line,ну а ,если строк больше нет ,то null
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
19.04.2013, 13:55
Цитата Сообщение от Ванеек Посмотреть сообщение
Ну ,если буфферридер найдет строки,то он присвоит их line,ну а ,если строк больше нет ,то null
Сначала этот null присвоится line, потом пройдет проверка, а потом вернется line. И что должно вернуться, по-вашему?
1
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
19.04.2013, 14:11  [ТС]
Цитата Сообщение от Skipy Посмотреть сообщение
Сначала этот null присвоится line, потом пройдет проверка, а потом вернется line. И что должно вернуться, по-вашему?
Я понимаю так ,когда мы только определяем line у нее null,в цикле она приобретает значение,но после цикла опять возвращает null

Добавлено через 13 минут
Цитата Сообщение от Skipy Посмотреть сообщение
И что должно вернуться, по-вашему?
в цикле какое-то значение,вне null
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
19.04.2013, 15:09
Цитата Сообщение от Ванеек Посмотреть сообщение
Я понимаю так ,когда мы только определяем line у нее null,в цикле она приобретает значение,но после цикла опять возвращает null

в цикле какое-то значение,вне null
Мама, роди меня обратно... Ну попробуйте хоть в отладчике пройтись по этому коду!

Пусть у нас три строки читаются.

1. При входе в метод line имеет то значение, которое Вы передали в метод. Поскольку передаете null - будет null.
2. Первая итерация цикла. line присваивается первая строка, после чего проверяется на "не null". Проверка дает результат true, цикл проходит.
3. Вторая итерация цикла. line присваивается вторая строка, после чего проверяется на "не null". Проверка дает результат true, цикл проходит.
4. Третья итерация цикла. line присваивается третья строка, после чего проверяется на "не null". Проверка дает результат true, цикл проходит.
5. Четвертая итерация цикла. Читать больше нечего, line присваивается значение null, которое у BufferedReader-а означает конец потока, после чего проверяется на "не null". Проверка дает результат false, цикл заканчивается.
6. В этот момент line присвоено значение null! А поскольку Вы возвращаете line - Вы вернете null.

Так понятнее, что происходит?

P.S. Не надо использовать конструкцию типа while ((line = br.readLine()) != null), она Вас вводит в заблуждение. Вот это аналог того, что есть у Вас:

Java
1
2
3
4
5
6
7
while(true){
    line = br.readLIne();
    if (line == null){
        break;
    }
    System.out.println("All: " + line);
}
Можно переписать так:

Java
1
2
3
4
5
line = br.readLIne();
while(line != null){
    System.out.println("All: " + line);
    line = br.readLIne();
}
Я предпочитаю первый вариант, он самый наглядный
0
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
19.04.2013, 15:30  [ТС]
Цитата Сообщение от Skipy Посмотреть сообщение
Так понятнее, что происходит?
Ага,только не понятно,что мне ему такое передать,чтобы я в маин уведел результаты чтения
0
18 / 18 / 2
Регистрация: 16.04.2013
Сообщений: 58
19.04.2013, 16:11
Java
1
2
String Listtest = Tslist(null, null, null, null);
        System.out.println("All main:" + Listtest);
Смотрите, тут вы выводите на консоль то значение, что возвращает ваш метод. Передавать ему можно/нужно разве что путь к файлу или уже "готовый" ридер. Отвечая на ваш вопрос, всё что нужно сделать - это вернуть правильное значение из метода.
Данный код выведет "All main: <last line of the file>", если вы это хотели:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class OopTest {
 
    public static void main(String[] args){
        String Listtest = Tslist();
        System.out.println("All main:" + Listtest);
 
    }
 
    public static String Tslist() {
        File file = new File("D:\\test.txt");
        BufferedReader br;
        String line = null;
        try {
            br = new BufferedReader(new FileReader(file));
 
            while (br.ready()) {
                line = br.readLine();
                System.out.println("All: " + line);
            }
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        } 
        return line;
    }
}
0
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
19.04.2013, 16:20  [ТС]
Ясно,спасибо)
0
18 / 18 / 2
Регистрация: 16.04.2013
Сообщений: 58
19.04.2013, 16:21
Проверка через br.ready() позволит избежать обnullения line при последнем считывании.
Если хотите сохранить все строки из файла есть два варианта:
1. Возвращать из тестлист() список со строками (или множество), который будет заполняться в внутри метода.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void main(String[] args){
        System.out.println("All main:\n" + Tslist());
 
    }
 
    public static List<String> Tslist() {
        File file = new File("D:\\test.txt");
        BufferedReader br;
        String line = null;
        List<String> result = new ArrayList<>();
        try {
            br = new BufferedReader(new FileReader(file));
            while (br.ready()) {
                line = br.readLine();
                result.add(line);
                //System.out.println("All: " + line);
            }
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        } 
        return result;
    }
2. Либо передать методу ссылку на хранилище строк, что вы пытались непонятным образом сделать.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void main(String[] args){
        List<String> storage = new ArrayList<>();
        Tslist(storage);
        System.out.println("All main:\n" + storage);
 
    }
 
    public static void Tslist(List<String> storage) {
        File file = new File("D:\\test.txt");
        BufferedReader br;
        String line = null;
        try {
            br = new BufferedReader(new FileReader(file));
            while (br.ready()) {
                line = br.readLine();
                storage.add(line);
                //System.out.println("All: " + line);
            }
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        } 
    }
0
68 / 68 / 1
Регистрация: 21.12.2012
Сообщений: 458
19.04.2013, 16:23  [ТС]
Все теперь стало яснее)
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
19.04.2013, 17:00
Цитата Сообщение от Ванеек Посмотреть сообщение
Ага,только не понятно,что мне ему такое передать,чтобы я в маин уведел результаты чтения
Передавать ничего не надо. Создаете внутри StringBuilder, в процессе чтения всё прочитанное через append приписываете. А из метода возвращаете stringBuilder.toString()
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.04.2013, 17:00
Помогаю со студенческими работами здесь

Использование метода в main
import java.util.HashMap; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.HashSet; import...

Параметры метода main
Я никак не могу врубиться, что это за параметр, который передается методу main - String args. В методичке написано, что это параметры...

Hello, World без метода main
Это Хорстманн и Корнелл &quot;Java 2. Библиотека профессионала&quot;. Вот код: public class Hello { static { ...

Конфликт класса и метода main
Вот такой вот выбивает вот такую ошибку. Подскажите, в чем дело? java: non-static variable this cannot be referenced from a static...

Вызов main() из вложенного класса
Возможно ли такое, вызов Main из вложенного класса? Пример из книги: package linkedlist; public class LinkedList { public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru