Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
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 ");
}
}
}
Будьте осторожны, VBA, Круглая функция использует округление банкира, где это округляется.5 к четному числу, как так:
Round (12.55, 1) would return 12.6 (rounds up)
Round (12.65, 1) would return 12.6 (rounds down)
Round (12.75, 1) would return 12.8 (rounds up)
принимая во внимание, что Excel Worksheet Function Round, всегда округляет в большую сторону.5.
я сделал некоторые тесты, и похоже, что.5 округлений (симметричное округление) также используются форматированием ячейки, и также для Ширины столбца, округляющейся (при использовании Общего Числового формата). Флаг 'Precision as displayed', кажется, не делает округления себя, это просто использует округленный результат формата ячеек.
я попытался реализовать функцию SymArith от Microsoft в VBA для моего округления, но нашел, что Фиксируют, имеет ошибку, когда Вы пытаетесь дать ему число как 58,55; функция, дающая результат 58,5 вместо 58,6. Я тогда наконец обнаружил, что можно использовать функцию Excel Worksheet Round, как так:
Приложение. Вокруг (58.55, 1)
Это позволит Вам делать нормальное округление в VBA, хотя это не может быть столь же быстро как некоторая пользовательская функция. Я понимаю, что это совершило полный оборот от вопроса, но хотело включать его для полноты.
Копье, уже упомянутое наследовать округление bug
в реализации VBA. Таким образом, мне нужна реальная функция округления в приложении VB6. Вот тот, который я использую. Это основано на том, который я нашел в сети, как обозначается в комментариях.
' -----------------------------------------------------------------------------
' RoundPenny
'
' Description:
' rounds currency amount to nearest penny
'
' Arguments:
' strCurrency - string representation of currency value
'
' Dependencies:
'
' Notes:
' based on RoundNear found here:
' http://advisor.com/doc/08884
'
' History:
' 04/14/2005 - WSR : created
'
Function RoundPenny(ByVal strCurrency As String) As Currency
Dim mnyDollars As Variant
Dim decCents As Variant
Dim decRight As Variant
Dim lngDecPos As Long
1 On Error GoTo RoundPenny_Error
' find decimal point
2 lngDecPos = InStr(1, strCurrency, ".")
' if there is a decimal point
3 If lngDecPos > 0 Then
' take everything before decimal as dollars
4 mnyDollars = CCur(Mid(strCurrency, 1, lngDecPos - 1))
' get amount after decimal point and multiply by 100 so cents is before decimal point
5 decRight = CDec(CDec(Mid(strCurrency, lngDecPos)) / 0.01)
' get cents by getting integer portion
6 decCents = Int(decRight)
' get leftover
7 decRight = CDec(decRight - decCents)
' if leftover is equal to or above round threshold
8 If decRight >= 0.5 Then
9 RoundPenny = mnyDollars + ((decCents + 1) * 0.01)
' if leftover is less than round threshold
10 Else
11 RoundPenny = mnyDollars + (decCents * 0.01)
12 End If
' if there is no decimal point
13 Else
' return it
14 RoundPenny = CCur(strCurrency)
15 End If
16 Exit Function
RoundPenny_Error:
17 Select Case Err.Number
Case 6
18 Err.Raise vbObjectError + 334, c_strComponent & ".RoundPenny", "Number '" & strCurrency & "' is too big to represent as a currency value."
19 Case Else
20 DisplayError c_strComponent, "RoundPenny"
21 End Select
End Function
' -----------------------------------------------------------------------------
Если Вы говорите об округлении к целочисленному значению (и не округление к n десятичные разряды), всегда существует старый школьный путь:
return int(var + 0.5)
(Можно сделать эту работу для n десятичные разряды также, но это начинает становиться немного грязным)
1 place = INT(number x 10 + .5)/10
3 places = INT(number x 1000 + .5)/1000
и так далее. Вы будете часто находить, что по-видимому топорные решения как это намного быстрее, чем использование функций Excel, потому что VBA, кажется, работает в другом пространстве памяти.
, например, If A > B Then MaxAB = A Else MaxAB = B
приблизительно 40 x быстрее, чем использование ExcelWorksheetFunction. Max
Интервал и Фиксация являются оба полезными функциями округления, которые дают Вам целую часть числа.
Интервал всегда округляет в меньшую сторону - Интервал (3.5) = 3, Интервал (-3.5) =-4
всегда Фиксирует раунды по направлению к нулю - Фиксируют (3.5) = 3, Фиксируют (-3.5) =-3
существуют также функции приведения, в особенности CInt и CLng, которые пытаются принудить число к целому типу или длинному типу (целые числа между-32 768 и 32,767, longs, между - 2,147,483,648 и 2,147,483,647). Они будут оба раунда к ближайшему целому числу, округляясь далеко от нуля от.5 - CInt (3.5) = 4, Cint (3.49) = 3, CInt (-3.5) =-4, и т.д.
В Швейцарии и в макрочастице в страховой индустрии, мы должны использовать несколько округляющихся правил, завися, если она chash, преимущество и т.д.
я в настоящее время использую функцию
Function roundit(value As Double, precision As Double) As Double
roundit = Int(value / precision + 0.5) * precision
End Function
, который, кажется, хорошо работает
Расшириться немного на принятом ответе:
"Круглая функция работает вокруг к даже, который отличается от раунда до большего".
- Microsoft
Формат всегда окружает.
Debug.Print Round(19.955, 2)
'Answer: 19.95
Debug.Print Format(19.955, "#.00")
'Answer: 19.96
ACC2000: погрешности округления, когда Вы используете числа с плавающей запятой: http://support.microsoft.com/kb/210423
ACC2000: как округлить в большую сторону число или вниз желаемым инкрементом: http://support.microsoft.com/kb/209996
Круглая функция: http://msdn2.microsoft.com/en-us/library/se6f2zfx.aspx
Как реализовать пользовательское округление процедур: http://support.microsoft.com/kb/196652
Вот простой способ всегда округлять до следующего целого числа в Access 2003:
BillWt = IIf([Weight]-Int([Weight])=0,[Weight],Int([Weight])+1)
Например: