- •От простого к ...
- •Один файл
- •Отделяем бинарные файлы от исходников
- •Используем пакеты
- •Если в программе несколько файлов
- •Если удивляет результат
- •Хорошо бы протестировать
- •Создадим библиотеку
- •Лучше снабдить библиотеку документацией
- •Надо узнать, что у библиотеки внутри
- •Можно подписать jar-архив
- •Использование библиотеки
- •Собираем программу
- •Первый способ
- •Второй способ
- •Третий способ
- •Запуск исполняемого jar-файла
- •Как быть с приложениями JavaEe
- •Ещё почитать
- •Комментарии (22)
Если удивляет результат
Есть возможность запустить отладчик. Для этого существует jdb. Сначала компилируем с ключом -g, чтобы у отладчика была информация.
javac -g -sourcepath ./src -d bin src/com/qwertovsky/helloworld/HelloWorld.java
Запускаем отладчик
jdb -classpath bin -sourcepath src com.qwertovsky.helloworld.HelloWorld
Initializing jdb ...
>
Отладчик запускает свой внутренний терминал для ввода команд. Справку по последним можно вывести с помощью команды help. Указываем точку прерывания на 9 строке в классе Calculator
> stop at com.qwertovsky.helloworld.Calculator:9
Deferring breakpoint com.qwertovsky.helloworld.Calculator:9.
It will be set after the class is loaded.
Запускаем на выполнение.
> run
run com.qwertovsky.helloworld.HelloWorld
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
>
VM Started: Set deferred breakpoint com.qwertovsky.helloworld.Calculator:9
Hello World!
Breakpoint hit: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=9 bci=0
9 Adder adder=new Adder();
Чтобы соориентироваться можно вывести кусок исходного кода, где в данный момент находится курссор.
main[1] list
5 public class Calculator
6 {
7 public int sum(int... a)
8 {
9 => Adder adder=new Adder();
10 for(int i:a)
11 {
12 adder.add(i);
13 }
14 return adder.getSum();
Узнаем, что из себя представляет переменная а.
main[1] print a
a = instance of int[2] (id=340)
main[1] dump a
a = {
2, 3
}
main[1] stop at com.qwertovsky.helloworld.operation.Adder:19
Deferring breakpoint com.qwertovsky.helloworld.operation.Adder:19.
It will be set after the class is loaded.
Продолжим исполнение.
main[1] cont
> Set deferred breakpoint com.qwertovsky.helloworld.operation.Adder:19
Breakpoint hit: "thread=main", com.qwertovsky.helloworld.operation.Adder.add(), line=19 bci=0
19 sum+=b;
main[1] list
15 }
16
17 public void add(int b)
18 {
19 => sum+=b;
20 }
21
22 public int getSum()
23 {
24 return sum;
main[1] print sum
sum = 0
main[1] print b
b = 2
Выполним код в текущей строке и увидим, что sum стала равняться 2.
main[1] step
>
Step completed: "thread=main", com.qwertovsky.helloworld.operation.Adder.add(), line=20 bci=10
20 }
main[1] print sum
sum = 2
Поднимемся из класса Adder в вызвавший его класс Calculator.
main[1] step up
>
Step completed: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=10 bci=36
10 for(int i:a)
Удаляем точку прерывания
main[1] clear com.qwertovsky.helloworld.operation.Adder:19
Removed: breakpoint com.qwertovsky.helloworld.operation.Adder:19
main[1] step
>
Step completed: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=12 bci=30
12 adder.add(i);
Можно избежать захода в методы, используя команду next.
main[1] next
>
Step completed: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=10 bci=36
10 for(int i:a)
main[1] next
>
Step completed: "thread=main", com.qwertovsky.helloworld.Calculator.sum(), line=14 bci=42
14 return adder.getSum();
Проверяем значение выражения и завершаем выполнение.
main[1] eval adder.getSum()
adder.getSum() = 5
main[1] cont
> 2+3=5
The application exited
