Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Существует определенное количество беспорядка вокруг terminlogy. Эта статья объясняет полезную таксономию систем типов.
PowerShell динамично, неявен введенный:
> $x=100
> $x=dir
Никакие ошибки типа - переменная может изменить свой тип во времени выполнения. Это похоже Python , Perl , JavaScript, но отличающееся от C++ , Java, C#, и т.д.
Однако:
> [int]$x = 100
> $x = dir
Cannot convert "scripts-2.5" to "System.Int32".
, Таким образом, это также поддерживает явный ввод переменных, если Вы хотите. Однако проверка типа сделана в а не время компиляции во время выполнения, таким образом, это не статически введено.
я видел, что некоторые говорят, что PowerShell использует вывод типа (потому что Вы не должны объявлять тип переменной), но я думаю, что это - неправильные слова. Вывод типа является функцией систем, которая делает проверку типа во время компиляции (как" var
" в C#). PowerShell только проверяет типы во времени выполнения, таким образом, он может проверить фактическое значение, а не действительно заключает.
Однако существует некоторый объем автоматического продолжения преобразования типов:
> [int]$a = 1
> [string]$b = $a
> $b
1
> $b.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
Так приблизительно [1 114] типы преобразовываются на лету. Это будет по большинству определений делать PowerShell со слабым контролем типов язык. Это, конечно, более слабо, чем, например, Python который (почти?) никогда не преобразовывают типы на лету. Но вероятно не в слабом как Perl, который преобразует почти что-либо по мере необходимости.
Это может быть при необходимости в нем, чтобы быть.
Как так:
[1] » [int]$x = 5
[2] » $x
5
[3] » $x = 'haha'
Cannot convert value "haha" to type "System.Int32". Error: "Input string was not in a correct format."
At line:1 char:3
+ $x <<<< = 'haha'
[4] »
Использование [тип] нотация, чтобы указать, заботитесь ли Вы о переменных, являющихся со строгим контролем типов.
РЕДАКТИРОВАНИЕ :
Как edg, на который указывают, это не препятствует тому, чтобы PowerShell интерпретировал "5" как целое число при выполнении (5 + "5"). Я вырыл немного больше, и по словам Bruce Payette в Windows PowerShell в Действии , PowerShell является на самом деле "неразборчивым типом языком". Так, я предполагаю, мой ответ является "видом".
Я думаю, смотря на добавление, что Строка к Международному примеру далее обеспечила бы больше зерна для фрезы обсуждения. Что считается динамическим преобразованием типа? Кто-то в одном из комментариев сказал что в этом случае:
4 + "4"
"4"
становится Int32. Я не полагаю, что это имеет место вообще. Я полагаю вместо этого, что промежуточный шаг происходит, где команда изменяется на:
4 + [System.Convert]::ToInt32("4")
Примечание, что это означает, что "4"
остается Строка посредством всего процесса. Для демонстрации этого рассмотрите этот пример:
19# $foo = "4"
20# $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
21# 4 + $foo
8
22# $foo.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
Технически это - язык со строгим контролем типов.
можно отказаться объявлять типы в оболочке, позволив этому вести себя как динамический введенный язык сценариев, но это перенесет объекты со слабым контролем типов в обертку типа "PsObject". Путем объявления объектов с помощью "Ново-объектного" синтаксиса объекты со строгим контролем типов и не wrappered.
$compilerParameters = New-Object System.CodeDom.Compiler.CompilerParameters
Я думаю, что необходимо будет определить то, под чем Вы подразумеваете "Со строгим контролем типов":
В информатике и программировании, термин строгий контроль типов используется для описания тех ситуаций, где языки программирования указывают одно или несколько ограничений на то, как могут быть смешаны операции, включающие значения, имеющие различные типы данных. Антоним является слабым контролем типов. Однако этим условиям дали такое большое разнообразие значений по краткой истории вычислений этого, часто трудно знать из контекста, какое отдельное устройство записи имеет в виду при использовании их.
Я отрекаюсь от своего предыдущего ответа - заключенный в кавычки ниже. Я должен был сказать что-то более детальное как:
PowerShell имеет сильную систему типов с устойчивым выводом типа и с динамическим контролем типов.
мне кажется, что существует несколько проблем на работе здесь, таким образом, ответы, просящие лучшее определение того, что было предназначено "языком со строгим контролем типов", были, вероятно, более мудрыми в их подходе к вопросу.
, Так как PowerShell пересекает много границ, ответ туда, где PowerShell находится, вероятно, существует в схеме Венна, состоящей из следующих областей:
", PowerShell является языком со строгим контролем типов.
Однако это только требует, чтобы Вы объявили тип, где существует неоднозначность.
, Если это может вывести тип, это не требует, чтобы Вы указали его".
Оболочка PowerShell динамически типизирована, проста и понятна. Так он описан его создателем Брюсом Пайеттом.
Кроме того, если бы кто-нибудь проходил курс базовой теории языков программирования, он бы это знал. Наличие системы аннотаций типов не означает, что она строго типизирована. Даже аннотированные переменные типа ведут себя динамически во время приведения. Любой язык, который позволяет назначить строку переменной и распечатать ее, а затем присвоить номер той же переменной и выполнять вычисления с ней, является динамически типизированным.
Кроме того, PowerShell имеет динамическую область видимости (если кто-нибудь знает, что это значит).